package oj.oj_225;
/**
 * 225. 用队列实现栈
 * https://leetcode.cn/problems/implement-queue-using-stacks/
 * 尝试用一个队列也可以实现
 */

import java.util.*;

public class MyStack {
    private final Queue<Integer> queue1 = new LinkedList<>();
    private final Queue<Integer> queue2 = new LinkedList<>();
    private Queue<Integer> 准备放元素的队列 = queue1;
    private Queue<Integer> 辅助队列 = queue2;

    public MyStack() {

    }

    public void push(int x) {
        准备放元素的队列.offer(x);
    }

    public int pop() {
        // 先把 size - 1 个元素，从 准备放元素的队列 放到 辅助队列中
        int size = 准备放元素的队列.size();
        for (int i = 0; i < size - 1; i++) {
            int e = 准备放元素的队列.poll();
            辅助队列.offer(e);
        }

        int ans = 准备放元素的队列.poll();

        Queue<Integer> t = 准备放元素的队列;
        准备放元素的队列 = 辅助队列;
        辅助队列 = t;

        return ans;
    }

    public int top() {
        int size = 准备放元素的队列.size();
        for (int i = 0; i < size - 1; i++) {
            int e = 准备放元素的队列.poll();
            辅助队列.offer(e);
        }

        int ans = 准备放元素的队列.poll();
        辅助队列.offer(ans);

        Queue<Integer> t = 准备放元素的队列;
        准备放元素的队列 = 辅助队列;
        辅助队列 = t;

        return ans;
    }

    public boolean empty() {
        return 准备放元素的队列.isEmpty();
    }

    public static void main(String[] args) {
        MyStack stack = new MyStack();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        System.out.println(stack.top());    // 4
        stack.push(5);
        System.out.println(stack.top());    // 5
        stack.push(6);

        System.out.println(stack.pop());    // 6
        System.out.println(stack.pop());    // 5

        stack.push(7);
        System.out.println(stack.pop());    // 7
        System.out.println(stack.pop());    // 4
        System.out.println(stack.pop());    // 3
        System.out.println(stack.pop());    // 2
        System.out.println(stack.pop());    // 1

    }
}
